import { defineStore } from "pinia"
import { AuthState } from "@/stores/interface"
import { getAuthMenuListApi } from "@/api/modules/login"
import { getFlatMenuList, getShowMenuList, getAllBreadcrumbList } from "@/utils"

// 美化数据格式（让后台格式符合框架菜单格式）
function inMenu(arrlist: any) {
  let objarr: any = []
  arrlist.forEach((e: any) => {
    if (e.children.length !== 0) {
      objarr.push({
        path: e.path,
        name: e.path.split("/")[e.path.split("/").length - 1],
        redirect: e.component ? e.component.split("views")[1] : null,
        meta: {
          icon: e.icon,
          title: e.name,
          isLink: e.isLink,
          isHide: e.isHide,
          isFull: e.isFull,
          isAffix: e.isAffix,
          isKeepAlive: e.isKeepAlive
        },
        children: e.children.length === 0 ? [] : inMenu(e.children)
      })
    } else {
      objarr.push({
        path: e.path,
        name: e.path.split("/")[e.path.split("/").length - 1],
        component: e.component ? e.component.split("views")[1] : null,
        meta: {
          icon: e.icon,
          title: e.name,
          isLink: e.isLink,
          isHide: e.isHide,
          isFull: e.isFull,
          isAffix: e.isAffix,
          isKeepAlive: e.isKeepAlive
        }
      })
    }
  })
  return objarr
}

export const useAuthStore = defineStore({
  id: "geeker-auth",
  state: (): AuthState => ({
    // 按钮权限列表
    authButtonList: [],
    // 菜单权限列表
    authMenuList: [],
    // 当前页面的 router name，用来做按钮权限筛选
    routeName: ""
  }),
  getters: {
    // 按钮权限列表
    authButtonListGet: state => state.authButtonList,
    // 菜单权限列表 ==> 这里的菜单没有经过任何处理
    authMenuListGet: state => state.authMenuList,
    // 菜单权限列表 ==> 左侧菜单栏渲染，需要剔除 isHide == true
    showMenuListGet: state => getShowMenuList(state.authMenuList),
    // 菜单权限列表 ==> 扁平化之后的一维数组菜单，主要用来添加动态路由
    flatMenuListGet: state => getFlatMenuList(state.authMenuList),
    // 递归处理后的所有面包屑导航列表
    breadcrumbListGet: state => getAllBreadcrumbList(state.authMenuList)
  },
  actions: {
    // Get AuthButtonList
    async getAuthButtonList() {
      const { data } = await getAuthMenuListApi()
      this.authButtonList = data.permissions
    },
    // Get AuthMenuList
    async getAuthMenuList() {
      const { data } = await getAuthMenuListApi()
      this.authMenuList = inMenu(data.sysMenus)
    }
    // Set RouteName
    // async setRouteName(name: string) {
    //   this.routeName = name;
    // }
  }
})
